
/*
Nodo.java
Autor: Luis Antonio Sigüenza Leiva
Carné: 10297
Fecha: 08 de Octubre del 2011
 * Descripcion: Nodos del arbol binario
*/

//******************************************************************
//REFERENCIA DE CLASE TOMADA DEL LIBRO:
//Java Structures: Data Structures for the Principled Programmer
//Capitulo 12: Arboles Binarios. Pagina 304-306
//******************************************************************
public class Nodo<E> {
    private int frecuencia;
    private String codigo;
    private E caracter;
    private Nodo izq, der;

    
    //-----------------------------------------------------------------
    // MÉTODOS CONSTRUCTORES: INICIALIZAN EL ESTADO DEL OBJETO
    //-----------------------------------------------------------------
    //Método constructor predefinido: inicializa el estado del objeto
    public Nodo() {
        this.frecuencia = 0;
    }

    //Método constructor personalizado: inicializa el estado del objeto
    public Nodo(E s) {
        this.caracter = s;
        this.frecuencia = 1;
    }

    //-----------------------------------------------------------------
    // MÉTODOS GET: DEVUELVEN EL ESTADO DE LOS ATRIBUTOS DEL OBJETO
    //-----------------------------------------------------------------
    //Método que devuelve el estado del atributo frecuencia
    public int getFrecuencia() {
        return frecuencia;
    }
    
    //Método que devuelve el estado caracter "activo"
    public E getCaracter() {
        return caracter;
    }
    
    //Método que devuelve el estado del codigo de cada caracter
    public String getCodigo() {
        return codigo;
    }
    
    
    
     //-----------------------------------------------------------------
    // MÉTODOS SET: MODIFICAN EL ESTADO DE LOS ATRIBUTOS DEL OBJETO
    //-----------------------------------------------------------------
    
    //Método que modifica el estado del atributo frecuencia
    public void setFrecuencia(int frecuencia) {
        this.frecuencia = frecuencia;
    }
    
    //Método que modifica el estado del atributo izq
    public void setIzq(Nodo izqu) {
        izq = izqu;
    }

    //Método que modifica el estado del atributo der
    public void setDer(Nodo dere) {
        der = dere;
    }

    
    //Método que aumenta la frecuencia del caracter "activo"
    public void masFrec() {
        this.frecuencia++;
    }
    
 
    //Metodo que recorre el arbol binario y despliega en pantalla la frecuencia
     //y el codigo asignado a cada caracter
    public void recorrer(Nodo nodo, String cod) {
            if(nodo.getCaracter() != null)
                System.out.println("| Caracter: " + nodo.getCaracter() + " | Frecuencia: " + nodo.getFrecuencia() +" | Codigo: " + cod + "|");
             
            if(nodo.izq != null) {
                codigo = cod + "0";
                nodo.recorrer(nodo.izq, codigo);
                
            }
            if(nodo.der!= null) {
                codigo = cod + "1";
                nodo.recorrer(nodo.der, codigo);
            }
 }

    //Metodo que recorre el arbol completo  
    public void recorrer() {
                codigo = "0";
                recorrer(izq, codigo);

                codigo = "1";
                recorrer(der, codigo);

    }
}

